/* @author cerimice */
package Reportes.PDF.OrdenServicio;

import Sistema.Configuracion;
import Reportes.PDF.Formato;
import Persistencia.Definicion.OrdenServicio;

import java.io.InputStream;
import java.util.logging.Logger;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import com.vaadin.terminal.StreamResource.StreamSource;

public class ReporteGenerarOrdenServicio implements StreamSource
    {
    private Formato                     formato;
    private OrdenServicio               orden;
    private final ByteArrayOutputStream archivoPDF;
    
    public ReporteGenerarOrdenServicio(OrdenServicio orden) throws Exception
        {
        this.orden = orden;
        formato = new Formato();
        archivoPDF =  new ByteArrayOutputStream();
        this.generarReporte();
        }
    
    private void generarReporte() throws Exception
        {
        Document document = null;
        try
            {
            document = new Document(PageSize.A5.rotate(),10,10,10,10);
            PdfWriter.getInstance(document,archivoPDF);
            document.open();
                document.add(formato.generarEncabezado("ORDEN DE SERVICIO"));
                document.add(generarTitulo());
                document.add(generarCuerpo());
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        finally
            {if (document != null){document.close();}}
        }
    
    private Paragraph generarTitulo()
        {
        Paragraph titulo = new Paragraph();
            titulo.add(new Paragraph("FOLIO ORDEN DE SERVICIO:     ", formato.getFuenteTexto()));
            titulo.add(new Paragraph(orden.getClave()+"     ", formato.getFuenteSubtitulo()));
            titulo.add(new Paragraph("FECHA DE ENTRADA:     ", formato.getFuenteTexto()));
            titulo.add(new Paragraph(Configuracion.getFormatoFechaLarga().format(orden.getFechaEntrada())+"     ", formato.getFuenteSubtitulo()));
            titulo.setAlignment(Element.ALIGN_RIGHT);
        return titulo;
        }
    
    private Paragraph generarCuerpo()
        {
        PdfPCell tablaTitulo1   = new PdfPCell (new Paragraph("DATOS DEL CLIENTE",formato.getFuenteTitulo()));
            tablaTitulo1.setBorder(0);
            tablaTitulo1.setHorizontalAlignment(Element.ALIGN_RIGHT);
            tablaTitulo1.setBackgroundColor(BaseColor.LIGHT_GRAY);
            PdfPCell datosCliente   = new PdfPCell();
                datosCliente.setBorder(0);
                datosCliente.addElement(new Paragraph("CLAVE DEL CLIENTE:", formato.getFuenteSubtitulo()));
                datosCliente.addElement(new Paragraph(orden.getObjCliente().getClave(), formato.getFuenteTexto()));
                datosCliente.addElement(new Paragraph("NOMBRE:", formato.getFuenteSubtitulo()));
                datosCliente.addElement(new Paragraph(orden.getObjCliente().getNombreCompleto(), formato.getFuenteTexto()));
                datosCliente.addElement(new Paragraph("TELEFONO FIJO:", formato.getFuenteSubtitulo()));
                datosCliente.addElement(new Paragraph(orden.getObjCliente().getTelefonoFijo(), formato.getFuenteTexto()));
                datosCliente.addElement(new Paragraph("TELEFONO MOVIL:", formato.getFuenteSubtitulo()));
                datosCliente.addElement(new Paragraph(orden.getObjCliente().getTelefonoMovil(), formato.getFuenteTexto()));
                datosCliente.setBorder(0);
        
        PdfPCell tablaTitulo2   = new PdfPCell (new Paragraph("DATOS DEL EQUIPO",formato.getFuenteTitulo()));
            tablaTitulo2.setBorder(0);
            tablaTitulo2.setHorizontalAlignment(Element.ALIGN_RIGHT);
            tablaTitulo2.setBackgroundColor(BaseColor.LIGHT_GRAY);
            PdfPCell datosEquipo   = new PdfPCell();
                datosEquipo.addElement(new Paragraph("DESCRIPCIÓN DEL EQUIPO:", formato.getFuenteSubtitulo()));
                datosEquipo.addElement(new Paragraph(orden.getEquipoDescripcion(), formato.getFuenteTexto()));
                datosEquipo.addElement(new Paragraph("MARCA:", formato.getFuenteSubtitulo()));
                datosEquipo.addElement(new Paragraph(orden.getObjMarca().getNombre(), formato.getFuenteTexto()));
                datosEquipo.addElement(new Paragraph("OBSERVACIONES DEL EQUIPO:", formato.getFuenteSubtitulo()));
                datosEquipo.addElement(new Paragraph(orden.getEquipoObservaciones(), formato.getFuenteTexto()));
                datosEquipo.setBorder(0);
        
        PdfPTable datos     = new PdfPTable(2);
            datos.addCell(tablaTitulo1);
            datos.addCell(tablaTitulo2);
            datos.addCell(datosCliente);
            datos.addCell(datosEquipo);
            datos.setWidthPercentage(95);
        
        Paragraph falla = new Paragraph();
            falla.add(new Paragraph("DESCRIPCIÓN DE LA FALLA:", formato.getFuenteSubtitulo()));
            falla.add(new Paragraph(orden.getEquipoFalla(), formato.getFuenteTexto()));
        
        PdfPTable firma = new PdfPTable(2);
            PdfPCell celdaFirma1   = new PdfPCell ();
                celdaFirma1.setBorder(0);
                celdaFirma1.setHorizontalAlignment(Element.ALIGN_CENTER);
            PdfPCell celdaFirma2   = new PdfPCell ();
                celdaFirma2.setBorder(0);
                celdaFirma2.setHorizontalAlignment(Element.ALIGN_CENTER);
            PdfPCell celdaFirma3   = new PdfPCell ();
                celdaFirma3.setBorder(0);
                celdaFirma3.addElement(new Paragraph(orden.getObjCliente().getNombreCompleto(),formato.getFuenteSubtitulo()));
                celdaFirma3.addElement(new Paragraph("CLIENTE",formato.getFuenteTexto()));
                celdaFirma3.setHorizontalAlignment(Element.ALIGN_CENTER);
            PdfPCell celdaFirma4   = new PdfPCell ();
                celdaFirma4.setBorder(0);
                celdaFirma4.addElement(new Paragraph(orden.getObjUsuario().getNombreCompleto(),formato.getFuenteSubtitulo()));
                celdaFirma4.addElement(new Paragraph("EMPLEADO",formato.getFuenteTexto()));
                celdaFirma4.setHorizontalAlignment(Element.ALIGN_CENTER);
            firma.addCell(celdaFirma1);
            firma.addCell(celdaFirma2);
            firma.addCell(celdaFirma3);
            firma.addCell(celdaFirma4);
            
        Paragraph cuerpo = new Paragraph();
            cuerpo.add(datos);
            cuerpo.add(falla);
            cuerpo.add(firma);
        return cuerpo;
        }

    @Override
    public InputStream getStream()
        {return new ByteArrayInputStream(archivoPDF.toByteArray());}
    }
